﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using KaartenLib;

namespace WindowsFormsApplication1
{
    public partial class InzetFormulier : Form
    {
        private int aantalPunten21;
        private int aantalPuntenTroef;
        private int aantalPuntenZelfdeType;
        private int aantalPuntenOpeenvolgend;
        private Speler speler;
        KaartSpel spel;
        private Boolean klaar = false;

        private List<Form> forms;
        private List<object> formsLine;
        // gebruikt voor troef/ type kaart te bepalen

        public InzetFormulier(ref Speler speler)
        {
            InitializeComponent();
            this.Speler = speler;
            spel = new KaartSpel();
            spel.Schudden();
            forms = new List<Form>();
            formsLine = new List<object>();
        }

        //params

        private Speler Speler
        {
            set
            {
                if (value == null && !(value is Speler))
                {
                    throw new ArgumentException("Speler is verplicht");
                }
                this.speler = value;
            }
        }

        public int AantalPunten21
        {
            get
            {
                return aantalPunten21;
            }
        }
        public int AantalPuntenTroef
        {
            get
            {
                return aantalPuntenTroef;
            }
        }
        public int AantalPuntenZelfdeType
        {
            get
            {
                return aantalPuntenZelfdeType;
            }
        }
        public int AantalPuntenOpeenvolgend
        {
            get
            {
                return aantalPuntenOpeenvolgend;
            }
        }
        public KaartSoort TypeKaart
        {
            get;
            set;
        }

        public KaartWaarde WaardeKaart
        {
            get;
            set;
        }

        //forms        

        private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(formsLine.Contains(sender)){
                int i = formsLine.IndexOf(sender);
                formsLine.RemoveAt(i);
                forms[i].Dispose();
                forms.RemoveAt(i);
            }
            String text = "";
            if (!comboBox2.Visible)
            {
                text = comboBox1.Text;
            }
            else if (!comboBox3.Visible)
            {
                text = comboBox2.Text;
            }
            else if (!comboBox4.Visible)
            {
                text = comboBox3.Text;
            }
            else
            {
                text = comboBox4.Text;
            }
            switch (text)
            {
                case "Winnen op punten":
                    label7.Text = "21en";
                    label3.Text = "Mogelijke winst: 2 X inzet";
                    setMaxNumerics(2);
                    break;
                case "Winnen met troefkaart":
                    label7.Text = "De speler kiest een troefkaart.\nIndien deze tussen de getrokken kaarten van de speler zit wint hij.";
                    label3.Text = "Mogelijke winst: 3 X inzet";
                    TroefForm troef = new TroefForm();
                    troef.Show();
                    troef.VisibleChanged += new EventHandler(setTroef);
                    forms.Add(troef);
                    formsLine.Add(sender);
                    button3.Enabled = false;
                    button4.Enabled = false;
                    //zetLabelText(1,"Troef:", typeKaart,waardeKaart);
                    setMaxNumerics(3);
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    label7.Text = "De speler kiest het type";
                    label3.Text = "Mogelijke winst: 2 X inzet";
                    TypeForm type = new TypeForm();
                    type.Show();
                    type.VisibleChanged += new EventHandler(setType);
                    forms.Add(type);
                    formsLine.Add(sender);
                    button3.Enabled = false;
                    button4.Enabled = false;
                    // zetLabelText(0,"Type:",typeKaart,KaartWaarde.Acht);
                    setMaxNumerics(2);
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    label7.Text = "Drie getrokken kaarten volgen mekaar op in waarde,\n ongeacht het type";
                    label3.Text = "Mogelijke winst: 1.5 X inzet";
                    setMaxNumerics(1.5);
                    break;
                case "":
                    label7.Text = "";
                    label3.Text = "";
                    break;
            }
        }

        public void setTroef(object sender, EventArgs args)
        {
            if (sender is TroefForm && !((TroefForm)sender).Visible)
            {
                int index = forms.IndexOf((TroefForm) sender);
                speler.Troef = new Kaart(((TroefForm)sender).getType(), ((TroefForm)sender).getWaarde());
                forms.RemoveAt(index);
                formsLine.RemoveAt(index);
                if (forms.Count == 0)
                {
                    button3.Enabled = true;
                    button4.Enabled = true;
                }
            }
        }
        
        public void setType(object sender, EventArgs args)
        {
            if (sender is TypeForm && !((TypeForm)sender).Visible)
            {
                int index = forms.IndexOf((TypeForm)sender);
                speler.ReeksType = ((TypeForm)sender).getType();
                forms.RemoveAt(index);
                formsLine.RemoveAt(index);
                if (forms.Count == 0)
                {
                    button3.Enabled = true;
                    button4.Enabled = true;
                }
            }
        }

#region zetHetMaximumVoorElkVeld
        private void setMaxNumerics(double deler)
        {
            if (!comboBox2.Visible)
            {
                numericUpDown5.Maximum = (int)(speler.Punten / deler);
            }
            else if (!comboBox3.Visible)
            {
                int waardeNumeric5 = (int)((int)(numericUpDown5.Value) * geefCorrecteCoefficicent(comboBox1.Text));
                numericUpDown1.Maximum = (int)((speler.Punten - waardeNumeric5) / deler);
            }
            else if (!comboBox4.Visible)
            {
                int waardeNumeric5 = (int)((int)(numericUpDown5.Value) * geefCorrecteCoefficicent(comboBox1.Text));
                int waardeNumeric1 = (int)((int)(numericUpDown1.Value) * geefCorrecteCoefficicent(comboBox2.Text));
                numericUpDown3.Maximum = (int)((speler.Punten - waardeNumeric5 - waardeNumeric1) / deler);
            }
            else
            {
                int waardeNumeric5 = (int)((int)(numericUpDown5.Value) * geefCorrecteCoefficicent(comboBox1.Text));
                int waardeNumeric1 = (int)((int)(numericUpDown1.Value) * geefCorrecteCoefficicent(comboBox2.Text));
                int waardeNumeric3 = (int)((int)(numericUpDown3.Value) * geefCorrecteCoefficicent(comboBox3.Text));
                numericUpDown4.Maximum = (int)((speler.Punten - waardeNumeric5 - waardeNumeric1 - waardeNumeric3) / deler);
            }

        }
#endregion

#region deMultipliervoorsetMax
        private double geefCorrecteCoefficicent(String text)
        {
            double val = 0;
            switch (text)
            {
                case "Winnen op punten":
                    val = 2;
                    break;
                case "Winnen met troefkaart":
                    val = 3;
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    val = 2;
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    val = 1.5;
                    break;
            }
            return val;
        }
#endregion
        private void button2_Click(object sender, EventArgs e)
        {
            if (label4.Visible == false)
            {
                label4.Visible = true;
                comboBox2.Visible = true;
                numericUpDown1.Visible = true;
                this.numericUpDown1.Maximum = speler.Punten - numericUpDown5.Value;
                button2.Location = new System.Drawing.Point(329, 70);
                label3.Location = new System.Drawing.Point(12, 97);
                label7.Location = new System.Drawing.Point(12, 62);
                button3.Location = new System.Drawing.Point(386, 130);
                ClientSize = new System.Drawing.Size(473, 165);
            }
            else if (label5.Visible == false)
            {
                label5.Visible = true;
                comboBox3.Visible = true;
                numericUpDown3.Visible = true;
                this.numericUpDown3.Maximum = speler.Punten - numericUpDown1.Value - numericUpDown5.Value;
                button2.Location = new System.Drawing.Point(329, 100);
                label3.Location = new System.Drawing.Point(12, 127);
                label7.Location = new System.Drawing.Point(12, 92);
                button3.Location = new System.Drawing.Point(386, 160);
                ClientSize = new System.Drawing.Size(473, 195);
            }
            else if (label6.Visible == false)
            {
                label6.Visible = true;
                comboBox4.Visible = true;
                numericUpDown4.Visible = true;
                this.numericUpDown4.Maximum = speler.Punten - numericUpDown3.Value - numericUpDown1.Value - numericUpDown5.Value;
                button2.Location = new System.Drawing.Point(329, 130);
                label3.Location = new System.Drawing.Point(12, 157);
                label7.Location = new System.Drawing.Point(12, 122);
                button3.Location = new System.Drawing.Point(386, 190);
                ClientSize = new System.Drawing.Size(473, 225);
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.numericUpDown5.Visible = false;
            this.numericUpDown1.Visible = false;
            this.numericUpDown3.Visible = false;
            this.numericUpDown4.Visible = false;
            this.comboBox1.Visible = false;
            this.comboBox2.Visible = false;
            this.comboBox3.Visible = false;
            this.comboBox4.Visible = false;
            this.button2.Visible = false;
            this.button3.Visible = false;
            this.label3.Visible = false;
            this.label4.Visible = false;
            this.label5.Visible = false;
            this.label6.Visible = false;
            this.label7.Visible = false;
            this.label8.Visible = false;

            this.label9.Visible = true;
            this.button4.Visible = true;
            this.button5.Visible = true;
            this.label10.Visible = true;

            //eerst checken of er type of troef is gekozen
            if (comboBox1.Text == "Winnen met 4 kaarten van hetzelfde type")
            {
                label10.Text = "Winnen met 4 kaarten van het type : "+ speler.ReeksType+ " voor " + numericUpDown5.Value + " punten;\n";
            }else if(comboBox1.Text=="Winnen met troefkaart"){
                label10.Text = "Winnen met troef: " + speler.Troef+ " voor " + numericUpDown5.Value + " punten;\n";
            }
            else
            {
                label10.Text = comboBox1.Text + " voor " + numericUpDown5.Value + " punten;\n";
            }

            //daarna, alle volgende boxen checken
            #region checkComboBox2
            if (comboBox2.Text != "")
            {
                if (comboBox2.Text == "Winnen met 4 kaarten van hetzelfde type")
                {
                    label10.Text += "Winnen met 4 kaarten van het type : " + speler.ReeksType + " voor " + numericUpDown1.Value + " punten;\n";
                }
                else if (comboBox2.Text == "Winnen met troefkaart")
                {
                    label10.Text += "Winnen met troef: " + speler.Troef + " voor " + numericUpDown1.Value + " punten;\n";
                }
                else
                {
                    label10.Text += comboBox2.Text + " voor " + numericUpDown1.Value + " punten;\n";
                }
            }
            #endregion
            #region checkComboBox3
            if (comboBox3.Text != "")
            {
                if (comboBox3.Text == "Winnen met 4 kaarten van hetzelfde type")
                {
                    label10.Text += "Winnen met 4 kaarten van het type : " + speler.ReeksType + " voor " + numericUpDown3.Value + " punten;\n";
                }
                else if (comboBox3.Text == "Winnen met troefkaart")
                {
                    label10.Text += "Winnen met troef: " + speler.Troef + " voor " + numericUpDown3.Value + " punten;\n";
                }
                else
                {
                    label10.Text += comboBox3.Text + " voor " + numericUpDown3.Value + " punten;\n";
                }
            }
            #endregion
            #region checkComboBox4
            if (comboBox4.Text != "")
            {
                if (comboBox4.Text == "Winnen met 4 kaarten van hetzelfde type")
                {
                    label10.Text += "Winnen met 4 kaarten van het type : " + speler.ReeksType + " voor " + numericUpDown4.Value + " punten;\n";
                }
                else if (comboBox4.Text == "Winnen met troefkaart")
                {
                    label10.Text += "Winnen met troef: " + speler.Troef + " voor " + numericUpDown4.Value + " punten;\n";
                }
                else
                {
                    label10.Text += comboBox4.Text + " voor " + numericUpDown4.Value + " punten;\n";
                }
            }
            #endregion


            ZetAantalPuntenPerTypeSpel();
        }

        private void ZetAantalPuntenPerTypeSpel()
        {
            switch (comboBox1.Text)
            {
                case "Winnen op punten":
                    aantalPunten21 += (int)numericUpDown5.Value;
                    break;
                case "Winnen met troefkaart":
                    aantalPuntenTroef += (int)numericUpDown5.Value;
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    aantalPuntenZelfdeType += (int)numericUpDown5.Value;
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    aantalPuntenOpeenvolgend += (int)numericUpDown5.Value;
                    break;
            }
            switch (comboBox2.Text)
            {
                case "Winnen op punten":
                    aantalPunten21 += (int)numericUpDown1.Value;
                    break;
                case "Winnen met troefkaart":
                    aantalPuntenTroef += (int)numericUpDown1.Value;
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    aantalPuntenZelfdeType += (int)numericUpDown1.Value;
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    aantalPuntenOpeenvolgend += (int)numericUpDown1.Value;
                    break;
            }
            switch (comboBox3.Text)
            {
                case "Winnen op punten":
                    aantalPunten21 += (int)numericUpDown3.Value;
                    break;
                case "Winnen met troefkaart":
                    aantalPuntenTroef += (int)numericUpDown3.Value;
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    aantalPuntenZelfdeType += (int)numericUpDown3.Value;
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    aantalPuntenOpeenvolgend += (int)numericUpDown3.Value;
                    break;
            }
            switch (comboBox4.Text)
            {
                case "Winnen op punten":
                    aantalPunten21 = (int)numericUpDown4.Value;
                    break;
                case "Winnen met troefkaart":
                    aantalPuntenTroef = (int)numericUpDown4.Value;
                    break;
                case "Winnen met 4 kaarten van hetzelfde type":
                    aantalPuntenZelfdeType = (int)numericUpDown4.Value;
                    break;
                case "Winnen met 3 opeenvolgende kaarten":
                    aantalPuntenOpeenvolgend = (int)numericUpDown4.Value;
                    break;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            this.numericUpDown5.Visible = true;
            this.comboBox1.Visible = true;
            this.button2.Visible = true;
            this.button3.Visible = true;
            this.label3.Visible = true;
            this.label7.Visible = true;
            this.label8.Visible = true;

            this.label9.Visible = false;
            this.button4.Visible = false;
            this.button5.Visible = false;
            this.label10.Visible = false;

        }

        private void button4_Click(object sender, EventArgs e)
        {
            klaar = true;
            speler.AantalPunten21(aantalPunten21);
            speler.AantalPuntenTroef(aantalPuntenTroef);
            /*if (aantalPuntenTroef > 0 && troef != null)
            {
                speler.Troef = troef;
            }
            else if(troef == null){
                klaar = false;
            }*/
            speler.AantalPuntenZelfdeType(aantalPuntenZelfdeType);
            /*if (aantalPuntenTroef > 0 && type != null)
            {
                speler.ReeksType = type
            }
            else if(type == null){
                klaar = false;
            }*/
            speler.AantalPuntenOpeenvolgend(aantalPuntenOpeenvolgend);
            //Punten setten
            if (klaar)
            {
                this.Hide();
            }
        }

        public Boolean IsKlaar
        {
            get
            {
                return klaar;
            }
        }

        /*public static void TerminateProgram(object sender, EventArgs e)
        {
            Application.Exit();
        }*/

    }


}
